package mine;

import java.util.Arrays;
import java.util.Random;

/**
 * 
 * @author DQ
 * 软件2班 邓强
 */
public class ClearMine {
	private int rows;
	private int cols;
	private int mineCount;
	private int level;
	private int [][] mineMap = null;
	
	public void setLevel(int level) {
		this.level = level;
		switch(level) {
		case 1 : rows = 9; cols = 9; mineCount = 10; break;
		case 2 : rows = 16; cols = 16; mineCount = 40; break;
		case 3 : rows = 16; cols = 30; mineCount = 99; break;
		}
	
		mineMap = new int[rows][cols];
}
	
	public int[][] getMineMap() {
		burnMine();
		return mineMap;
	}
	
	public void resetMap() {
		for(int i = 0; i < rows; i++) {
			Arrays.fill(mineMap[i], 0);
		}
	}
	
	/**
	 * 布雷的方法
	 * 0b00000000
	 * 0b00000001 用最后一位表示有雷或无雷
	 * 0b00000110 用倒数第二和第三位表示格子的状态  00： 表示没有开  01： 开了  10： 插旗
	 * 0b01111000第2、3、4、5位表示雷的数量
	 */
	private void burnMine() {
		Random rd = new Random();
		
		int x,y;
		for(int i = 0; i < mineCount;) {
			x = rd.nextInt(rows);
			y = rd.nextInt(cols);
			//判断是否有雷

				//将这个位置周围的雷的数量加一
				if( (mineMap[x][y] & 0b00000001) == 0 ) { //说明没有雷
					
					mineMap[x][y] = 0b00000001; //将雷放到这个位置
					
					if(x - 1 >= 0) { //向上
						mineMap[x - 1][y] += 0b000001000; //正上方
					}
					
					if(x - 1 >= 0 && y - 1 >= 0) {
						mineMap[x - 1][y - 1] += 0b000001000;  //上面的左边
					}
					
					if(x - 1 >= 0 && y + 1 < cols) {
						mineMap[x - 1][y + 1] += 0b000001000; //上面的右边
					}
			
					if(x + 1 < rows) { //向下
						mineMap[x + 1][y] += 0b000001000; //正下方
					}
				
					if(x + 1 < rows && y - 1 >= 0) {
						mineMap[x + 1][y - 1] += 0b000001000;  //下左
					}
					
					if(x + 1 < rows && y + 1 < cols) {
						mineMap[x + 1][y + 1] += 0b000001000; //下右
					}
	
					if(y - 1 >= 0) { // 左
						mineMap[x][y - 1] += 0b000001000;
					}
					if(y + 1 < cols) { //右
						mineMap[x][y + 1] += 0b000001000;
					}
					++ i;
				}
		}
	}
	
	public int getRows() {
		return rows;
	}
	
	public int getCols() {
		return cols;
	}
	
	public int getMineCount() {
		return mineCount;
	}
	
	public int getLevel() {
		return level;
	}
}
